﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace RelatorioCEE.Classes.Aluno
{
    class AlunoDAO : BaseDAO
    {
        /// <summary>
        /// Realiza a inclusão de um objeto Aluno no banco de dados.
        /// </summary>
        /// <param name="alunoDto"></param>
        public void Incluir(AlunoDTO alunoDto)
        {
            string strProvider = base.getStringConexao();



                //Query
                StringBuilder _query = new StringBuilder("INSERT INTO aluno ");
                _query.Append("(Nome, Data_Nascimento, Telefone, Celular,");
                _query.Append("Matricula, Nome_Responsavel, Nome_Responsavel2, Cpf_Responsavel, Logradouro, Numero, ");
                _query.Append("Complemento, Bairro, Cidade, Estado, Naturalidade, Nacionalidade, Data_Nascimento_R1, Data_Nascimento_R2, Grau_Parentesco_R1, Grau_Parentesco_R2, Cep, Data_Atualizacao, observacao ) ");
                _query.Append("VALUES ('<%Nome%>', '<%Data_Nascimento%>', '<%Telefone%>', '<%Celular%>', ");
                _query.Append("'<%Matricula%>', '<%Nome_Responsavel%>', '<%Nome_Responsavel2%>', '<%Cpf_Responsavel%>', ");
                _query.Append("'<%Logradouro%>', '<%Numero%>', '<%Complemento%>', '<%Bairro%>', '<%Cidade%>', ");
                _query.Append("'<%Estado%>', '<%Naturalidade%>', '<%Nacionalidade%>', ");
                _query.Append("'<%Data_Nascimento_R1%>', '<%Data_Nascimento_R2%>', '<%Grau_Parentesco_R1%>', '<%Grau_Parentesco_R2%>', ");
                _query.Append("'<%Cep%>', '<%Data_Atualizacao%>', '<%observacao%>')");

            
                //DataNascimentoR1, DataNascimentoR2, CEP, Observacao, GrauParentescoR1, GrauParentescoR2
                //Parametros
                _query.Replace("<%Nome%>", alunoDto.Nome);
                _query.Replace("<%Data_Nascimento%>", alunoDto.Data_Nascimento);
                _query.Replace("<%Telefone%>", alunoDto.Telefone);
                _query.Replace("<%Celular%>", alunoDto.Celular);
                _query.Replace("<%Matricula%>", alunoDto.Matricula);
                _query.Replace("<%Nome_Responsavel%>", alunoDto.NomeResponsavel);
                _query.Replace("<%Nome_Responsavel2%>", alunoDto.NomeResponsavel2);
                _query.Replace("<%Cpf_Responsavel%>", alunoDto.CpfResponsavel);
                _query.Replace("<%Logradouro%>", alunoDto.Logradouro);
                _query.Replace("<%Numero%>", alunoDto.Numero);
                _query.Replace("<%Complemento%>", alunoDto.Complemento);
                _query.Replace("<%Bairro%>", alunoDto.Bairro);
                _query.Replace("<%Cidade%>", alunoDto.Cidade);
                _query.Replace("<%Estado%>", alunoDto.Estado);
                _query.Replace("<%Naturalidade%>", alunoDto.Naturalidade);
                _query.Replace("<%Nacionalidade%>", alunoDto.Nacionalidade);
                String data_atualizacao = DateTime.Now.ToShortDateString();
                _query.Replace("<%Data_Atualizacao%>", data_atualizacao);
                _query.Replace("<%Data_Nascimento_R1%>", alunoDto.DataNascimentoR1);
                _query.Replace("<%Data_Nascimento_R2%>", alunoDto.DataNascimentoR2);
                _query.Replace("<%Grau_Parentesco_R1%>", alunoDto.GrauParentescoR1);
                _query.Replace("<%Grau_Parentesco_R2%>", alunoDto.GrauParentescoR2);
                _query.Replace("<%Cep%>", alunoDto.Cep);
                _query.Replace("<%observacao%>", alunoDto.Observacao);

                string strSql = _query.ToString();
                OleDbConnection con = new OleDbConnection(strProvider);
                OleDbCommand cmd = new OleDbCommand(strSql, con);
                try
                {
                    con.Open();
                    cmd.CommandType = CommandType.Text;
                    cmd.ExecuteNonQuery();
                }
                //catch(Exception ex)
                //{
                //     ex.Message.ToString();
                //}
                finally
                {
                    con.Close();
                }
            
        }

        /// <summary>
        /// Realiza a atualização de dados de um determinado aluno
        /// </summary>
        /// <param name="alunoDto"></param>
        public void Atualizar(AlunoDTO alunoDto)
        {
            string strProvider = base.getStringConexao();

            //Query
            StringBuilder _query = new StringBuilder("UPDATE aluno SET ");
            _query.Append("Nome = '<%Nome%>', Data_Nascimento = '<%Data_Nascimento%>', Telefone = '<%Telefone%>', Celular = '<%Celular%>', ");
            _query.Append("Matricula = '<%Matricula%>', Nome_Responsavel = '<%Nome_Responsavel%>', Nome_Responsavel2 = '<%Nome_Responsavel2%>', Cpf_Responsavel =  '<%Cpf_Responsavel%>', Logradouro = '<%Logradouro%>', Numero = '<%Numero%>', ");
            _query.Append("Complemento = '<%Complemento%>', Bairro = '<%Bairro%>', Cidade = '<%Cidade%>', Estado = '<%Estado%>', Naturalidade = '<%Naturalidade%>', Nacionalidade = '<%Nacionalidade%>', Data_Nascimento_R1 = '<%Data_Nascimento_R1%>', Data_Nascimento_R2 = '<%Data_Nascimento_R2%>', Grau_Parentesco_R1 = '<%Grau_Parentesco_R1%>', Grau_Parentesco_R2 = '<%Grau_Parentesco_R2%>', Cep = '<%Cep%>', Data_Atualizacao = '<%Data_Atualizacao%>', observacao = '<%observacao%>' ");
            _query.Append(" WHERE 1=1");

            _query.Append(" AND id_aluno LIKE '<%id_aluno%>'");
            _query.Replace("<%id_aluno%>", Convert.ToString(alunoDto.Id_aluno));

            //Parametros
            _query.Replace("<%Nome%>", alunoDto.Nome);
            _query.Replace("<%Data_Nascimento%>", alunoDto.Data_Nascimento);
            _query.Replace("<%Telefone%>", alunoDto.Telefone);
            _query.Replace("<%Celular%>", alunoDto.Celular);
            _query.Replace("<%Matricula%>", alunoDto.Matricula);
            _query.Replace("<%Nome_Responsavel%>", alunoDto.NomeResponsavel);
            _query.Replace("<%Nome_Responsavel2%>", alunoDto.NomeResponsavel2);
            _query.Replace("<%Cpf_Responsavel%>", alunoDto.CpfResponsavel);
            _query.Replace("<%Logradouro%>", alunoDto.Logradouro);
            _query.Replace("<%Numero%>", alunoDto.Numero);
            _query.Replace("<%Complemento%>", alunoDto.Complemento);
            _query.Replace("<%Bairro%>", alunoDto.Bairro);
            _query.Replace("<%Cidade%>", alunoDto.Cidade);
            _query.Replace("<%Estado%>", alunoDto.Estado);
            _query.Replace("<%Naturalidade%>", alunoDto.Naturalidade);
            _query.Replace("<%Nacionalidade%>", alunoDto.Nacionalidade);
            String data_atualizacao = DateTime.Now.ToShortDateString();
            _query.Replace("<%Data_Atualizacao%>", data_atualizacao );
            _query.Replace("<%Data_Nascimento_R1%>", alunoDto.DataNascimentoR1);
            _query.Replace("<%Data_Nascimento_R2%>", alunoDto.DataNascimentoR2);
            _query.Replace("<%Grau_Parentesco_R1%>", alunoDto.GrauParentescoR1);
            _query.Replace("<%Grau_Parentesco_R2%>", alunoDto.GrauParentescoR2);
            _query.Replace("<%Cep%>", alunoDto.Cep);
            _query.Replace("<%observacao%>", alunoDto.Observacao);



            string strSql = _query.ToString();
            OleDbConnection con = new OleDbConnection(strProvider);
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            try
            {
                con.Open();
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
            }
            //catch(Exception ex)
            //{
            //     ex.Message.ToString();
            //}
            finally
            {
                con.Close();
            }

        }


        /// <summary>
        /// Consultar - retorna uma lista de alunos a partir de parametors filtrados.
        /// </summary>
        /// <param name="Nome"></param>
        /// <param name="Matricula"></param>
        /// <param name="Telefone"></param>
        /// <param name="NomeResponsavel"></param>
        /// <param name="CpfResponsavel"></param>
        /// <returns></returns>

        public List<AlunoDTO> Consultar()
        {
            List<AlunoDTO> retorno = new List<AlunoDTO>();
            string strProvider = base.getStringConexao();

            StringBuilder _query = new StringBuilder("SELECT ");
            _query.Append("id_aluno, Nome, Data_Nascimento, Telefone, Celular, observacao, ");
            _query.Append("Matricula, observacao, Nome_Responsavel, Nome_Responsavel2, Cpf_Responsavel, Logradouro, Numero, ");
            _query.Append("Complemento, Bairro, Cidade, Estado, Naturalidade, Nacionalidade, Data_Nascimento_R1, Data_Nascimento_R2, Grau_Parentesco_R1, Grau_Parentesco_R2, Cep, Data_Atualizacao ");
            _query.Append(" FROM ALUNO");
            _query.Append(" WHERE 1=1 ");


            _query.Append(" ORDER BY Nome");

            string strSql = _query.ToString();

            OleDbConnection con = new OleDbConnection(strProvider);
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            cmd.CommandType = CommandType.Text;

            con.Open();
            OleDbDataReader aReader = cmd.ExecuteReader();

            while (aReader.Read())
            {
                AlunoDTO AlunoRet = new AlunoDTO();
                AlunoRet.Id_aluno = Convert.ToInt32(aReader["id_Aluno"]);
                AlunoRet.Nome = (String)(aReader["Nome"]);
                AlunoRet.Matricula = (String)(aReader["Matricula"]);
                AlunoRet.Telefone = (String)(aReader["Telefone"]);
                AlunoRet.NomeResponsavel = (String)(aReader["Nome_Responsavel"]);
                AlunoRet.CpfResponsavel = (String)(aReader["Cpf_Responsavel"]);
                AlunoRet.Cep = (String)(aReader["Cep"]);
                AlunoRet.Nacionalidade = (String)(aReader["Nacionalidade"]);
                AlunoRet.Naturalidade = (String)(aReader["Naturalidade"]);
                AlunoRet.Data_Nascimento = (String)(aReader["Data_Nascimento"]);
                AlunoRet.Observacao = (String)(aReader["observacao"]);
                AlunoRet.Celular = (String)(aReader["Celular"]);
                AlunoRet.Logradouro = (String)(aReader["Logradouro"]);
                AlunoRet.Numero = (String)(aReader["Numero"]);
                AlunoRet.Complemento = (String)(aReader["Complemento"]);
                AlunoRet.Bairro = (String)(aReader["Bairro"]);
                AlunoRet.Cidade = (String)(aReader["Cidade"]);
                AlunoRet.Estado = (String)(aReader["Estado"]);
                AlunoRet.NomeResponsavel2 = (String)(aReader["Nome_Responsavel2"]);
                AlunoRet.DataNascimentoR1 = (String)(aReader["Data_Nascimento_R1"]);
                AlunoRet.DataNascimentoR2 = (String)(aReader["Data_Nascimento_R2"]);
                AlunoRet.GrauParentescoR1 = (String)(aReader["Grau_Parentesco_R1"]);
                AlunoRet.GrauParentescoR2 = (String)(aReader["Grau_Parentesco_R2"]);
                AlunoRet.Data_Atualizacao = (String)(aReader["Data_Atualizacao"]);

                retorno.Add(AlunoRet);
            }
            aReader.Close();
            con.Close();
            return retorno;
        }

        public List<AlunoDTO> Consultar(String Nome, String Matricula, String Telefone, String NomeResponsavel, String CpfResponsavel)
        {
            List<AlunoDTO> retorno = new List<AlunoDTO>();
            string strProvider = base.getStringConexao();

            StringBuilder _query = new StringBuilder("SELECT ");
            _query.Append("id_aluno, Nome, Data_Nascimento, Telefone, Celular, observacao, ");
            _query.Append("Matricula, observacao, Nome_Responsavel, Nome_Responsavel2, Cpf_Responsavel, Logradouro, Numero, ");
            _query.Append("Complemento, Bairro, Cidade, Estado, Naturalidade, Nacionalidade, Data_Nascimento_R1, Data_Nascimento_R2, Grau_Parentesco_R1, Grau_Parentesco_R2, Cep, Data_Atualizacao ");
            _query.Append(" FROM ALUNO");
            _query.Append(" WHERE 1=1 ");


            if (Nome.Length > 0)
            {
                _query.Append(" AND NOME LIKE '<%Nome%>'");
                _query.Replace("<%Nome%>", "%" + Nome + "%");
            }

            if (Matricula.Length > 0)
            {
                _query.Append(" AND Matricula LIKE '<%Matricula%>' ");
                _query.Replace("<%Matricula%>", "%" + Matricula + "%");
            }

            if (Telefone.Length > 0)
            {
                _query.Append(" AND Telefone LIKE '<%Telefone%>' ");
                _query.Replace("<%Telefone%>", "%" + Telefone + "%");
            }

            if (NomeResponsavel.Length > 0)
            {
                _query.Append(" AND Nome_Responsavel LIKE '<%Nome_Responsavel%>'");
                _query.Replace("<%Nome_Responsavel%>", "%" + NomeResponsavel + "%");
            }

            if (CpfResponsavel.Length > 0)
            {
                _query.Append(" AND Cpf_Responsavel LIKE '<%Cpf_Responsavel%>'");
                _query.Replace("<%Cpf_Responsavel%>", "%" + CpfResponsavel + "%");
            }


            _query.Append(" ORDER BY Nome");

            string strSql = _query.ToString();

            OleDbConnection con = new OleDbConnection(strProvider);
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            cmd.CommandType = CommandType.Text;

            con.Open();
            OleDbDataReader aReader = cmd.ExecuteReader();

            while (aReader.Read())
            {
                AlunoDTO AlunoRet = new AlunoDTO();
                AlunoRet.Id_aluno = Convert.ToInt32(aReader["id_Aluno"]);
                AlunoRet.Nome = (String)(aReader["Nome"]);
                AlunoRet.Matricula = (String)(aReader["Matricula"]);
                AlunoRet.Telefone = (String)(aReader["Telefone"]);
                AlunoRet.NomeResponsavel = (String)(aReader["Nome_Responsavel"]);
                AlunoRet.CpfResponsavel = (String)(aReader["Cpf_Responsavel"]);
                AlunoRet.Cep = (String)(aReader["Cep"]);
                AlunoRet.Nacionalidade = (String)(aReader["Nacionalidade"]);
                AlunoRet.Naturalidade = (String)(aReader["Naturalidade"]);
                AlunoRet.Data_Nascimento = (String)(aReader["Data_Nascimento"]);
                AlunoRet.Observacao = (String)(aReader["observacao"]);
                AlunoRet.Celular = (String)(aReader["Celular"]);
                AlunoRet.Logradouro = (String)(aReader["Logradouro"]);
                AlunoRet.Numero = (String)(aReader["Numero"]);
                AlunoRet.Complemento = (String)(aReader["Complemento"]);
                AlunoRet.Bairro = (String)(aReader["Bairro"]);
                AlunoRet.Cidade = (String)(aReader["Cidade"]);
                AlunoRet.Estado = (String)(aReader["Estado"]);
                AlunoRet.NomeResponsavel2 = (String)(aReader["Nome_Responsavel2"]);
                AlunoRet.DataNascimentoR1 = (String)(aReader["Data_Nascimento_R1"]);
                AlunoRet.DataNascimentoR2 = (String)(aReader["Data_Nascimento_R2"]);
                AlunoRet.GrauParentescoR1 = (String)(aReader["Grau_Parentesco_R1"]);
                AlunoRet.GrauParentescoR2 = (String)(aReader["Grau_Parentesco_R2"]);
                AlunoRet.Data_Atualizacao = (String)(aReader["Data_Atualizacao"]);

                retorno.Add(AlunoRet);
            }
            aReader.Close();
            con.Close();
            return retorno;
        }


        /// <summary>
        /// Retorna um objeto do tipo aluno apartir de um ID de aluno.
        /// </summary>
        /// <param name="Id_Aluno"></param>
        /// <returns></returns>
        public AlunoDTO ConsultarId(Int32 Id_Aluno)
        {
            AlunoDTO AlunoRet = new AlunoDTO();
            string strProvider = base.getStringConexao();

            StringBuilder _query = new StringBuilder("SELECT ");
            _query.Append("id_aluno, observacao, Nome, Data_Nascimento, Telefone, Celular,");
            _query.Append("Matricula, Nome_Responsavel, Nome_Responsavel2, Cpf_Responsavel, Logradouro, Numero, ");
            _query.Append("Complemento, Bairro, Cidade, Estado, Naturalidade, Nacionalidade, Data_Nascimento_R1, Data_Nascimento_R2, Grau_Parentesco_R1, Grau_Parentesco_R2, Cep, Data_Atualizacao ");
            _query.Append(" FROM ALUNO");
            _query.Append(" WHERE 1=1");

            _query.Append(" AND id_aluno LIKE '<%id_aluno%>'");
            _query.Replace("<%id_aluno%>", Convert.ToString(Id_Aluno));

          
            _query.Append(" ORDER BY Nome");

            string strSql = _query.ToString();
    
            OleDbConnection con = new OleDbConnection(strProvider);
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            cmd.CommandType = CommandType.Text;

            con.Open();
            OleDbDataReader aReader = cmd.ExecuteReader();

            while (aReader.Read())
            {
                AlunoRet.Id_aluno = Convert.ToInt32(aReader["id_Aluno"]);
                AlunoRet.Nome = (String)(aReader["Nome"]);
                AlunoRet.Matricula = (String)(aReader["Matricula"]);
                AlunoRet.Telefone = (String)(aReader["Telefone"]);
                AlunoRet.NomeResponsavel = (String)(aReader["Nome_Responsavel"]);
                AlunoRet.CpfResponsavel = (String)(aReader["Cpf_Responsavel"]);
                AlunoRet.Cep = (String)(aReader["Cep"]);  
                AlunoRet.Nacionalidade = (String)(aReader["Nacionalidade"]);
                AlunoRet.Naturalidade = (String)(aReader["Naturalidade"]);
                AlunoRet.Data_Nascimento = (String)(aReader["Data_Nascimento"]);
                AlunoRet.Observacao = (String)(aReader["observacao"]);
                AlunoRet.Celular = (String)(aReader["Celular"]);
                AlunoRet.Logradouro = (String)(aReader["Logradouro"]);
                AlunoRet.Numero = (String)(aReader["Numero"]);
                AlunoRet.Complemento = (String)(aReader["Complemento"]);
                AlunoRet.Bairro = (String)(aReader["Bairro"]);
                AlunoRet.Cidade = (String)(aReader["Cidade"]);
                AlunoRet.Estado = (String)(aReader["Estado"]);
                AlunoRet.NomeResponsavel2 = (String)(aReader["Nome_Responsavel2"]);
                AlunoRet.DataNascimentoR1 = (String)(aReader["Data_Nascimento_R1"]);
                AlunoRet.DataNascimentoR2 = (String)(aReader["Data_Nascimento_R2"]);
                AlunoRet.GrauParentescoR1 = (String)(aReader["Grau_Parentesco_R1"]);
                AlunoRet.GrauParentescoR2 = (String)(aReader["Grau_Parentesco_R2"]);
                AlunoRet.Data_Atualizacao = (String)(aReader["Data_Atualizacao"]);

            }
            aReader.Close();
            con.Close();
            return AlunoRet;
        }

        public void Excluir(int Id_Aluno)
        {
            string strProvider = base.getStringConexao();

            //Query
            StringBuilder _query = new StringBuilder("DELETE FROM aluno ");
            _query.Append(" WHERE 1=1");

            _query.Append(" AND id_aluno LIKE '<%id_aluno%>'");
            _query.Replace("<%id_aluno%>", Convert.ToString(Id_Aluno));

           
            string strSql = _query.ToString();
            OleDbConnection con = new OleDbConnection(strProvider);
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            try
            {
                con.Open();
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
            }
            //catch(Exception ex)
            //{
            //     ex.Message.ToString();
            //}
            finally
            {
                con.Close();
            }

        }


    }
}
